



<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Not using else where appropriate in a loop &mdash; Python Anti-Patterns  documentation</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../_static/css/ribbon.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/font-awesome-4.1.0/css/font-awesome.min.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/menu.css" type="text/css" />
  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="Python Anti-Patterns  documentation" href="../index.html"/>
        <link rel="up" title="Correctness" href="index.html"/>
        <link rel="next" title="Not using explicit unpacking" href="not_using_explicit_unpacking.html"/>
        <link rel="prev" title="Not using defaultdict()" href="not_using_defaultdict.html"/> 

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="../index.html"> Python Anti-Patterns</a>
        <div role="search">
  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
      </div>


      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
        
            <ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="index.html"><i class="fa fa-check"></i> Correctness</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="accessing_a_protected_member_from_outside_the_class.html">Accessing a protected member from outside the class</a></li>
<li class="toctree-l2"><a class="reference internal" href="assigning_a_lambda_to_a_variable.html">Assigning a <cite>lambda</cite> expression to a variable</a></li>
<li class="toctree-l2"><a class="reference internal" href="assigning_to_builtin.html">Assigning to built-in function</a></li>
<li class="toctree-l2"><a class="reference internal" href="bad_except_clauses_order.html">Bad except clauses order</a></li>
<li class="toctree-l2"><a class="reference internal" href="bad_first_argument_given_to_super.html">Bad first argument given to <code class="docutils literal notranslate"><span class="pre">super()</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="else_clause_on_loop_without_a_break_statement.html"><code class="docutils literal notranslate"><span class="pre">else</span></code> clause on loop without a <code class="docutils literal notranslate"><span class="pre">break</span></code> statement</a></li>
<li class="toctree-l2"><a class="reference internal" href="exit_must_accept_three_arguments.html"><code class="docutils literal notranslate"><span class="pre">__exit__</span></code> must accept 3 arguments: type, value, traceback</a></li>
<li class="toctree-l2"><a class="reference internal" href="explicit_return_in_init.html">Explicit return in __init__</a></li>
<li class="toctree-l2"><a class="reference internal" href="future_import_is_not_the_first_statement.html"><code class="docutils literal notranslate"><span class="pre">__future__</span></code> import is not the first non-docstring statement</a></li>
<li class="toctree-l2"><a class="reference internal" href="implementing_java-style_getters_and_setters.html">Implementing Java-style getters and setters</a></li>
<li class="toctree-l2"><a class="reference internal" href="indentation_contains_mixed_spaces_and_tabs.html">Indentation contains mixed spaces and tabs</a></li>
<li class="toctree-l2"><a class="reference internal" href="indentation_contains_tabs.html">Indentation contains tabs</a></li>
<li class="toctree-l2"><a class="reference internal" href="method_could_be_a_function.html">Method could be a function</a></li>
<li class="toctree-l2"><a class="reference internal" href="method_has_no_argument.html">Method has no argument</a></li>
<li class="toctree-l2"><a class="reference internal" href="missing_argument_to_super.html">Missing argument to <code class="docutils literal notranslate"><span class="pre">super()</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="mutable_default_value_as_argument.html">Using a mutable default value as an argument</a></li>
<li class="toctree-l2"><a class="reference internal" href="no_exception_type_specified.html">No exception type(s) specified</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_defaultdict.html">Not using <code class="docutils literal notranslate"><span class="pre">defaultdict()</span></code></a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Not using <code class="docutils literal notranslate"><span class="pre">else</span></code> where appropriate in a loop</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_explicit_unpacking.html">Not using explicit unpacking</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_get_to_return_a_default_value_from_a_dictionary.html">Not using <code class="docutils literal notranslate"><span class="pre">get()</span></code> to return a default value from a dict</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_setdefault_to_initialize_a_dictionary.html">Not using <code class="docutils literal notranslate"><span class="pre">setdefault()</span></code> to initialize a dictionary</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../maintainability/index.html"><i class="fa fa-puzzle-piece"></i> Maintainability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../readability/index.html"><i class="fa fa-eye"></i> Readability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"><i class="fa fa-lock"></i> Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../performance/index.html"><i class="fa fa-dashboard"></i> Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../django/index.html"><i class="fa fa-book"></i> Django</a></li>
</ul>

        
      </div>
      &nbsp;

    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Python Anti-Patterns</a>
      </nav>


      
      <div class="wy-nav-content" id="signup-box" >
        <div class="rst-content">
          <div class="navigation" role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Documentation</a> &raquo;</li>
      
          <li><a href="index.html"><i class="fa fa-check"></i> Correctness</a> &raquo;</li>
      
    <li>Not using <code class="docutils literal notranslate"><span class="pre">else</span></code> where appropriate in a loop</li>
      <li class="wy-breadcrumbs-aside">
        
          <a href="../_sources/correctness/not_using_else_in_a_loop.rst.txt" rel="nofollow"> View page source</a>
        
      </li>
  </ul>
  <hr/>
</div>

          <div role="main">
            
  <div class="section" id="not-using-else-where-appropriate-in-a-loop">
<h1>Not using <code class="docutils literal notranslate"><span class="pre">else</span></code> where appropriate in a loop<a class="headerlink" href="#not-using-else-where-appropriate-in-a-loop" title="Permalink to this headline">¶</a></h1>
<p>The Python language provides a built-in <code class="docutils literal notranslate"><span class="pre">else</span></code> clause for <code class="docutils literal notranslate"><span class="pre">for</span></code> loops. If a <code class="docutils literal notranslate"><span class="pre">for</span></code> loop completes without being prematurely interrupted by a <code class="docutils literal notranslate"><span class="pre">break</span></code> or <code class="docutils literal notranslate"><span class="pre">return</span></code> statement, then the <code class="docutils literal notranslate"><span class="pre">else</span></code> clause of the loop is executed.</p>
<div class="section" id="anti-pattern">
<h2>Anti-pattern<a class="headerlink" href="#anti-pattern" title="Permalink to this headline">¶</a></h2>
<p>The code below searches a list for a magic number. If the magic number is found in the list, then the code prints <code class="docutils literal notranslate"><span class="pre">Magic</span> <span class="pre">number</span> <span class="pre">found</span></code>. If the magic number is not found, then the code prints <code class="docutils literal notranslate"><span class="pre">Magic</span> <span class="pre">number</span> <span class="pre">not</span> <span class="pre">found</span></code>.</p>
<p>The code uses a flag variable called <code class="docutils literal notranslate"><span class="pre">found</span></code> to keep track of whether or not the magic number was found in the list.</p>
<p>The logic in this code is valid; it will accomplish its task. But the Python language has built-in language constructs for handling this exact scenario and which can express the same idea much more concisely and without the need for flag variables that track the state of the code.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">magic_number</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">found</span> <span class="o">=</span> <span class="kc">False</span>

<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="n">magic_number</span><span class="p">:</span>
        <span class="n">found</span> <span class="o">=</span> <span class="kc">True</span>
        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Magic number found&quot;</span><span class="p">)</span>
        <span class="k">break</span>

<span class="k">if</span> <span class="ow">not</span> <span class="n">found</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Magic number not found&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="best-practice">
<h2>Best practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
<div class="section" id="use-else-clause-with-for-loop">
<h3>Use <code class="docutils literal notranslate"><span class="pre">else</span></code> clause with <code class="docutils literal notranslate"><span class="pre">for</span></code> loop<a class="headerlink" href="#use-else-clause-with-for-loop" title="Permalink to this headline">¶</a></h3>
<p>In Python, you can declare an <code class="docutils literal notranslate"><span class="pre">else</span></code> loop in conjunction with a <code class="docutils literal notranslate"><span class="pre">for</span></code> loop. If the <code class="docutils literal notranslate"><span class="pre">for</span></code> loop iterates to completion without being prematurely interrupted by a <code class="docutils literal notranslate"><span class="pre">break</span></code> or <code class="docutils literal notranslate"><span class="pre">return</span></code> statement, then Python executes the <code class="docutils literal notranslate"><span class="pre">else</span></code> clause of the loop.</p>
<p>In the modified code below, the <code class="docutils literal notranslate"><span class="pre">for</span></code> loop will iterate through all three items in the list. Because the magic number is not contained in the list, the <code class="docutils literal notranslate"><span class="pre">if</span></code> statement always evaluates to <code class="docutils literal notranslate"><span class="pre">False</span></code>, and therefore the <code class="docutils literal notranslate"><span class="pre">break</span></code> statement is never encountered. Because Python never encounters a <code class="docutils literal notranslate"><span class="pre">break</span></code> statement while iterating over the loop, it executes the <code class="docutils literal notranslate"><span class="pre">else</span></code> clause.</p>
<p>The modified code below is functionally equivalent to the original code above, but this modified code is more concise than the original code and does not require any flag variables for monitoring the state of the code.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">magic_number</span> <span class="o">=</span> <span class="mi">4</span>

<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="n">magic_number</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Magic number found&quot;</span><span class="p">)</span>
        <span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Magic number not found&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Since <code class="docutils literal notranslate"><span class="pre">else</span></code> on a <code class="docutils literal notranslate"><span class="pre">for</span></code> loop is so unintuitive and error-prone, even some experienced Python developers suggest not using this feature at all.</p>
</div>
</div>
</div>
<div class="section" id="references">
<h2>References<a class="headerlink" href="#references" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/2/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops">Python Language Reference - else Clauses on Loops</a></p></li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="not_using_explicit_unpacking.html" class="btn btn-neutral float-right" title="Not using explicit unpacking"/>Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="not_using_defaultdict.html" class="btn btn-neutral" title="Not using defaultdict()"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>

    <!--End mc_embed_signup-->
  <a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a> - Last updated: Sep 29, 2020 
</footer>
        </div>
      </div>

    </section>


  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>
      <script type="text/javascript" src="../_static/language_data.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

  <!-- Place this tag right after the last button or just before your close body tag. -->
  <script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>

</body>
</html>